我們前面已經完成兩個 Model 了,現在要做完第三個 Model,也就是 Product 產品
,這個 Model 跟前面有什麼關聯呢?
每一間商店可以賣出很多產品,並且每個產品可以在很多間商店出現,也就是多對多的關係!
ex. 商店 A 有賣產品 A、B、C,商店 B 也有賣產品 A、B
Product | type | Foreign Key |
---|---|---|
title | String | |
price | Float |
這個表是因為多對多的關係產生的表,這個表會有下面兩個欄位:
StoreProduct | type | Foreign Key |
---|---|---|
store_id | Integer | Store |
product_id | Integer | Product |
Ps. 這邊就不再對介紹為什麼會有第三張表了,這邊提供一個連結 - 多對多關聯介紹,非常清楚了說明多對多關聯的由來
先來整理一下等等會用到的一些頁面
<!-- 產品列表頁 -->
http://127.0.0.1:8000/online/prodcts
<!-- 產品新增頁 -->
http://127.0.0.1:8000/online/product/create/
<!-- 產品資訊頁 -->
http://127.0.0.1:8000/online/product/3
<!-- 產品更新頁 -->
http://127.0.0.1:8000/online/product/3/update/
<!-- 產品刪除頁 -->
http://127.0.0.1:8000/online/product/3/delete/
多對多
的關係,一個商店可以販賣很多產品,一個產品也可以在很多商店被賣,所以要多加一段 store
的 ForeignKeyDecimalField
# online/models.py
class Product(models.Model):
title = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
store = models.ManyToManyField(Store)
def get_absolute_url(self):
return reverse('product-detail', args=[str(self.id)])
def __str__(self):
return self.title
這一段裡面比較特殊的是 store = models.ManyToManyField(Store)
,他是在設定今天 Product 跟 Store 的關聯,如果今天是兩個表是 多對多
,就把要設關聯的物件放到 ManyToManyField
裡面:
ROR 的多對多關聯設定,也是在產生 migration 的時候設定好,所以跟 Django 的差異不大
每當修改 Model 欄位的資料,就要記得這兩個指令喔!首先看一下我們的 model 改變:
$ python3 manage.py makemigrations
------
Migrations for 'online':
online/migrations/0003_product.py
- Create model Product
再來執行 migrate
:
$ python3 manage.py migrate
------
Operations to perform:
Apply all migrations: admin, auth, contenttypes, online, sessions
Running migrations:
Applying online.0003_product... OK
還記得嗎?執行完 model 具現化的指令後!你的 migration
資料夾裡面應該會多一個檔案,我們把它打開來看看:
# store/online/migrations/0002_product.py
# Generated by Django 4.2.4 on 2023-09-07 11:12
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('online', '0002_store'),
]
operations = [
migrations.CreateModel(
name='Product',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100)),
('price', models.DecimalField(decimal_places=2, max_digits=10)),
('store', models.ManyToManyField(to='online.store')),
],
),
]
裡面有這些檔案,主要就是在說你剛剛新增的 Model,還有這一個檔案跟 0001_initial
檔案的關聯,這樣以後看 migration
檔案就可以了解 Model
的變化歷程
今天學到哪些東西呢?
最後附上 Github: https://github.com/eagle0526/Django-store